﻿using System;

using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Maestro_Proveedores;
using System.IO;

namespace Maestro_Proveedores.Forms
{
    public partial class Reclamos : Form
    {
        /// <summary>
        /// Este registro tiene los permisos que tiene usuario que inicio sesion sobre el presente formulario (lectura, escritura, etc..)
        /// </summary>
        private Auditoria.CORPORATIVADataSet.SEG_PERMISOSRow seg_PERMRow = null;
        /// <summary>
        /// Identificador del formulario, esta variable utilizada para controlar el acceso al formulario y para realizar la auditoria
        /// </summary>
        public static string TIPO = "077";
        /// <summary>
        /// Este formulario tiene la responsabilidad de gestionar la informacion correspondienete a los reclamos a los proveedores de la Corporación. 
        /// </summary>
        public Reclamos()
        {
            InitializeComponent();
            this.fechaDateTimePicker.Value = DateTime.Now.Date;
            this.fechaDateTimePicker.MaxDate = DateTime.Now.Date;

            //this.plazo_respuestaDateTimePicker.Value = DateTime.Now.AddDays(10);
           // this.plazo_respuestaDateTimePicker.MinDate = fechaDateTimePicker.Value;

            this.fecha_atendidoDateTimePicker.Value = DateTime.Now.Date;
            this.fecha_atendidoDateTimePicker.MaxDate = DateTime.Now.Date;
            this.fecha_atendidoDateTimePicker.MinDate = this.fechaDateTimePicker.Value;            
        }

        private void Raclamos_Load(object sender, EventArgs e)
        {
            //--- registrar los resultados de la evaluacion financiera
            this.cORPORATIVADataSet.ESTADO.AddESTADORow(true, "ATENDIDO");
            this.cORPORATIVADataSet.ESTADO.AddESTADORow(false, "Pendiente");

            //--- cargar la lista de estados en el combobox correspondiente.

            this.estadoComboBox.DataSource = Arreglos.EstadosReclamo;

            this.pRV_proveedorTableAdapter.FillByNit(this.cORPORATIVADataSet.PRV_PROVEEDOR, "0");
            //--- auditoria
            if (ConfiguracionDelSistema.auditar)
            {
                Session.SEG_PERMISOSTableAdapter.FillByTipoGrupo(Session.AUDITORIADataSet.SEG_PERMISOS, TIPO + Session.Seg_USUARRow.CODGRU);
                this.seg_PERMRow = Session.AUDITORIADataSet.SEG_PERMISOS[0];
            }
            //--- verificar los reclamos pendientes y/o atrasados
            new RevisarEstadoReclamos().ShowDialog();
        }

        private void buscar_Click(object sender, EventArgs e)
        {
            Cursor.Current = Cursors.WaitCursor;
            if (this.NIT_buscar_textBox.Text == "")
            {
                return;
            }

            //--- si tiene 4 o menos caracteres es muy problable que sea el ID
            if (this.NIT_buscar_textBox.Text.Length <= 4)
            {
                //-- si no lo encuentro por el ID, lo busco por el NIT
                if (0 == this.pRV_proveedorTableAdapter.FillById(this.cORPORATIVADataSet.PRV_PROVEEDOR, this.NIT_buscar_textBox.Text))
                {
                    this.pRV_proveedorTableAdapter.FillByNit(this.cORPORATIVADataSet.PRV_PROVEEDOR, this.NIT_buscar_textBox.Text);
                }
            }
            //--- si tiene mas de 4 caracteres es muy provable que sea el NIT
            else
            {
                //-- si no lo encuentro por el NIT, lo busco por el ID
                if (0 == this.pRV_proveedorTableAdapter.FillByNit(this.cORPORATIVADataSet.PRV_PROVEEDOR, this.NIT_buscar_textBox.Text))
                {
                    this.pRV_proveedorTableAdapter.FillById(this.cORPORATIVADataSet.PRV_PROVEEDOR, this.NIT_buscar_textBox.Text);
                }
            }

            if (this.cORPORATIVADataSet.PRV_PROVEEDOR.Rows.Count > 0)
            {
                this.pRV_RECLAMOTableAdapter.FillByIdProveedor(this.cORPORATIVADataSet.PRV_RECLAMO, this.idTextBox.Text);
                
                this.pRV_RECLAMOBindingSource.AddNew();
                //-- nombre del usuario con primera letra de cada palabra en mayuscula
                this.elaborado_porTextBox.Text = System.Globalization.CultureInfo.CurrentCulture.TextInfo.ToTitleCase(Session.Seg_USUARRow.NOMBRE.ToLower());
                //-- Cargo del empleado
                this.elaborado_por_cargoTextBox.Text = System.Globalization.CultureInfo.CurrentCulture.TextInfo.ToTitleCase(Session.Seg_USUARRow.CARGO.ToLower());
                //-- direccion del empleado
                this.elaborado_por_direccionTextBox.Text = System.Globalization.CultureInfo.CurrentCulture.TextInfo.ToTitleCase(Session.Seg_USUARRow.DIRECCION.ToLower());
                //-- se selecciona el primer estado de la lista
                this.estadoComboBox.SelectedIndex = 0;
                //-- se marca como no atendido
                this.is_atendidoCheckBox.Checked = false;                
                //-- se borra cualquier archivo adjunto
                this.adjuntoSoporteRutaTextBox.Text = "";
            }
            else
            {
                MessageBox.Show("Este proveedor aun no ha sido registrado en el sistema.");                
            }

            Cursor.Current = Cursors.Default;
        }

        private void buscar_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
            {
                this.buscar_Click(null, null);
            }
        }

        #region Exepciones en la insercion de datos

        private void dataError(object sender, DataGridViewDataErrorEventArgs e)
        {
            //MessageBox.Show("ERROR...\n" + e.Exception.ToString());
            //MessageBox.Show(sender.GetType().ToString());
            ((BindingSource)((DataGridView)sender).DataSource).CancelEdit();
        }

        #endregion

        #region Eventos asociados a los botones del BindingNavigator

        private void add_Click(object sender, EventArgs e)
        {
            BindingSource bs = ((BindingNavigator)((ToolStripButton)sender).GetCurrentParent()).BindingSource;
            try
            {
                bs.AddNew();
                //-- actualizo los valores de las fechas, para evitar que salga el mensaje que dice que debe seleccionar la fecha.
                this.plazo_respuestaDateTimePicker.Value = DateTime.Now.AddDays(1);
                this.fechaDateTimePicker.Value = DateTime.Now.Date;
                //-- nombre del usuario con primera letra de cada palabra en mayuscula
                this.elaborado_porTextBox.Text = System.Globalization.CultureInfo.CurrentCulture.TextInfo.ToTitleCase(Session.Seg_USUARRow.NOMBRE.ToLower());
                //-- Cargo del empleado
                this.elaborado_por_cargoTextBox.Text = System.Globalization.CultureInfo.CurrentCulture.TextInfo.ToTitleCase(Session.Seg_USUARRow.CARGO.ToLower());
                //-- direccion del empleado
                this.elaborado_por_direccionTextBox.Text = System.Globalization.CultureInfo.CurrentCulture.TextInfo.ToTitleCase(Session.Seg_USUARRow.DIRECCION.ToLower());
                //-- se selecciona el primer estado de la lista
                this.estadoComboBox.SelectedIndex = 0;
                //-- se marca como no atendido
                this.is_atendidoCheckBox.Checked = false;
                //-- se borra cualquier archivo de soporte
                this.adjuntoSoporteRutaTextBox.Text = "";
            }
            catch (Exception ex)
            {
                Maestro_Proveedores.herramientas.MessageException.show(ex);
            }
        }

        private void pRV_ReclamosSAVEBindingNavigator_Click(object sender, EventArgs e)
        {
            //-- si no se ha seleccionado un proveedor no se ejecuta el metodo
            if (this.idTextBox.Text.Equals(string.Empty))
            {
                return;
            }
            
            //-- SI el idActual es negativo, es por que el registro se va a ingresar, si no es por que el registro actual se va a actualizar
            short idActual = short.Parse(((System.Data.DataRowView)this.pRV_RECLAMOBindingSource.Current)["id"].ToString());                        
            //--- si se va a ingresar un nuevo registro no puede ser marcado como atendido
            if (this.is_atendidoCheckBox.Checked && idActual <= 0)
            {
                MessageBox.Show("El reclamo se debe guardado con anterioridad y despues ser marcado como atendido.");
                return;
            }
            //--- si se el registro se va a marcar como atendido, se debe ingresar un archivo ajunto
            if (this.is_atendidoCheckBox.Checked && idActual>0 && this.adjuntoSoporteRutaTextBox.Text.Equals(string.Empty))
            {
                MessageBox.Show("Para cerrar el reclamo debe adjuntar un archivo de Soporte.");
                return;
            }
            //--- si el reclamo se va a agregar por primera vez, el estado de este debe ser el primero que aparece en la lista correspondiente
            if (idActual < 0) 
            {
                this.estadoComboBox.SelectedIndex = 0;
            }
            //--- si el reclamo se va a amarcar como atendido su estado sera el ultimo item de la lista correspondiente.
            if (this.is_atendidoCheckBox.Checked && idActual > 0)
            {
                this.estadoComboBox.SelectedIndex = this.estadoComboBox.Items.Count-1;
            }
            //--- alerta para ocnfirmar que se desea guardar el registro.
            if (MessageBox.Show("Este registro no podra ser eliminado posteriormente.\n¿Desea registrarlo?", "", MessageBoxButtons.YesNo).Equals(DialogResult.No))
            {
                return;
            }
            Cursor.Current = Cursors.WaitCursor;
            BindingSource bs = ((BindingNavigator)((ToolStripButton)sender).GetCurrentParent()).BindingSource;
            try
            {
                //-- guardar el archivo adjunto en la BD
                if (this.is_atendidoCheckBox.Checked)
                {
                    //-- definir el nombre del nuevo archivo
                    string nuevoArchivo = Session.Seg_USUARRow.CEDULA+"-"+ (DateTime.Now.Year) + "" + (DateTime.Now.Month) + "" + (DateTime.Now.Day) + "" + (DateTime.Now.Hour) + "" + (DateTime.Now.Minute) + "" + (DateTime.Now.Second) + "" + (DateTime.Now.Millisecond);
                    //--definir la extension del nuevo archivo.
                    string[] temp = this.adjuntoSoporteRutaTextBox.Text.Split('.');
                    nuevoArchivo +="."+temp[temp.Length - 1];
                    //--- guardo el nombre del nuevo archivo en el campo coorespondiente del formulario
                    this.archivo_soporteTextBox.Text = nuevoArchivo;
                    //--- armo la ruta completa del nuevo archivo
                    nuevoArchivo = ConfiguracionDelSistema.directorioReclamos+nuevoArchivo;
                    //-- subir el archivo al directorio remoto
                    if (!herramientas.File.copyFile(this.adjuntoSoporteRutaTextBox.Text, nuevoArchivo))
                    {
                        MessageBox.Show("El soporte no pudo ser adjuntado.\nVerifique que cuenta con los permisos necesarios para realizar esta operación.");
                        return;
                    }
                }

                //-- actualizo los valores de las fechas, para evitar que salga el mensaje que dice que debe seleccionar la fecha.
                this.plazo_respuestaDateTimePicker.Value = this.plazo_respuestaDateTimePicker.Value.AddMinutes(1);
                this.fechaDateTimePicker.Value = this.fechaDateTimePicker.Value.Date.AddMinutes(1);
                //-- guardar los registros.                
                Validate();
                bs.EndEdit();
                //---auditoria
                if (ConfiguracionDelSistema.auditar)
                {
                    string[] usuArios = new string[] { Session.Seg_USUARRow.USUARIO, TIPO, string.Empty, string.Empty };
                    Session.AUDITORIADataSet.CargarAuditoria(this.cORPORATIVADataSet.PRV_RECLAMO, usuArios, this.seg_PERMRow);
                    Session.AUDITORIADataSet.GuardarAuditoria();
                }
                //---actualizar la lista
                this.pRV_RECLAMOTableAdapter.Update(this.cORPORATIVADataSet.PRV_RECLAMO);
            }
            catch (Exception ex)
            {
                Maestro_Proveedores.herramientas.MessageException.show(ex);
            }
            Cursor.Current = Cursors.Default;
        }

        private void deshacer_Click(object sender, EventArgs e)
        {
            Cursor.Current = Cursors.WaitCursor;
            BindingSource bs = ((BindingNavigator)((ToolStripButton)sender).GetCurrentParent()).BindingSource;
            try
            {
                foreach (DataTable dt in this.cORPORATIVADataSet.Tables)
                {
                    if (bs.DataMember.ToString().Contains(dt.TableName))
                    {
                        dt.RejectChanges();
                        bs.CancelEdit();
                        return;
                    }
                }
            }
            catch (Exception ex)
            {
                Maestro_Proveedores.herramientas.MessageException.show(ex);
                bs.CancelEdit();
            }
            Cursor.Current = Cursors.Default;
        }
        
        #endregion

        private void fechaDateTimePicker_ValueChanged(object sender, EventArgs e)
        {
            this.fecha_atendidoDateTimePicker.MinDate = this.fechaDateTimePicker.Value;
        }

        private void adjuntarButton_Click(object sender, EventArgs e)
        {
            this.is_atendidoCheckBox.Checked = true;
            //-- aqui se debe adjunta un nuevo archivo, teniendo en cuenta que este archivo se puede adjuntar solo cuando el reclamo se marque como atendido.
            if (this.idTextBox.Text.Equals(string.Empty))
                return;

            if ((int.Parse(((System.Data.DataRowView)this.pRV_RECLAMOBindingSource.Current)["id"].ToString())) <= 0)
            {
                MessageBox.Show("El reclamo debe ser impreso y firmado antes de adjuntar un archivo de Soporte.");
                return;
            }

            this.Cursor = Cursors.WaitCursor;
            try
            {
                OpenFileDialog saveFileDialog = new OpenFileDialog();
                saveFileDialog.Multiselect = false;
                saveFileDialog.RestoreDirectory = true;

                if (saveFileDialog.ShowDialog() != DialogResult.OK)
                {
                    this.Cursor = Cursors.Default;
                    return;
                }
                this.adjuntoSoporteRutaTextBox.Text = saveFileDialog.FileName;                
            }
            catch (Exception ex)
            {
                Maestro_Proveedores.herramientas.MessageException.show(ex);
            }
            this.Cursor = Cursors.Default;
        }

        private void is_atendidoCheckBox_CheckedChanged(object sender, EventArgs e)
        {
            if (!this.is_atendidoCheckBox.Checked)
                this.adjuntoSoporteRutaTextBox.Text = "";
            else
                this.fecha_atendidoDateTimePicker.Value = DateTime.Now.Date;
        }

        private void descargarLinkLabel_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
            if (this.archivo_soporteTextBox.Text.Equals(string.Empty) || !this.is_atendidoCheckBox.Checked)
                return;
            if (!herramientas.File.copyFile(ConfiguracionDelSistema.directorioReclamos+this.archivo_soporteTextBox.Text))
                MessageBox.Show("El archivo NO pudo ser descargado con exito.");
        }

        private void generarReportepictureBox_Click(object sender, EventArgs e)
        {
            if (this.idTextBox.Text.Equals(string.Empty))
                return;

            short id = short.Parse(((System.Data.DataRowView)this.pRV_RECLAMOBindingSource.Current)["id"].ToString());

            if (id > 0) 
            {                 
                ((FormReport_ReclamoAProveedores)herramientas.Redirect.getFormulario("FormReport_ReclamoAProveedores")).mostrarReporte(id);
            }
                
        }

        //private void enviarMailAlJefe(short idReclamo) 
        //{ 
        //    //-- temaMail=0 --> nuevo reclamo
        //    //-- temaMail=1 --> reclamo atendido
        //    //-- temaMail=2 --> actualizacion de reclamo
        //    int temaMail = 0;
        //    string destinatario = "";
        //    string asunto = "";
        //    string remitente = "";
        //    string nombreRemitente = "";
        //    string body = "";
            
        //    //-- si el id es negativo, entonces fue por que se agrego un nuevo registro, si no fue por que se actualizo
        //    if (idReclamo <= 0) 
        //    {
        //        //---actualizo el ID del reclamo.
        //        idReclamo = short.Parse(((System.Data.DataRowView)this.pRV_RECLAMOBindingSource.Current)["id"].ToString());                                
        //    }
        //    //-- fue marcado como atendido
        //    else if (this.is_atendidoCheckBox.Checked)
        //    {
        //        temaMail = 1;
        //    }
        //    //-- el registro fue editado    
        //    else 
        //    {
        //        temaMail = 2;
        //    }

        //    destinatario = ConfiguracionDelSistema.mailJefeAdquisiciones;
        //    remitente = ConfiguracionDelSistema.mailMaestroProveedores;
        //    nombreRemitente = ConfiguracionDelSistema.nombreMaestroProveedores;

        //    //---asunto
        //    if (temaMail.Equals(0))
        //    {
        //        asunto = "Se creado el reclamo Nº " + idReclamo+".";
        //    }
        //    else if (temaMail.Equals(1))
        //    {
        //        asunto = "el reclamo Nº " + idReclamo+" ha sido atendido.";
        //    }
        //    else if (temaMail.Equals(2))
        //    {
        //        asunto = "Se ha modificado el reclamo Nº "+idReclamo+".";
        //    }

        //    //--armo el cuerpo del Mail (HTML).
        //    if (temaMail.Equals(0))
        //    {
        //        body += "<h2>Nuevo reclamo</h2>";
        //        body += "<p>Se ha registrado un nuevo reclamo en el sistema, por favor verifique la información mostrada en el cuerpo de este mensaje.</p>";
        //    }
        //    else if (temaMail.Equals(1))
        //    {
        //        body += "<h2>Reclamo atendido</h2>";
        //        body += "<p>El reclamo Nº " + idReclamo + " ha sido marcado como atendido, por favor verifique la información mostrada en el cuerpo de este mensaje.</p>";
        //    }
        //    else if (temaMail.Equals(2))
        //    {
        //        body += "<h2>Nuevo reclamo</h2>";
        //        body += "<p>Se ha modificado la informacion del reclamo Nº " + idReclamo + ", por favor verifique la información mostrada en el cuerpo de este mensaje.</p>";
        //    }

        //    //--- obtengo los datos asociados al id del reclamo para llenar el cuerpo del mail.
        //    this.reporte_ReclamoAProveedoresTableAdapter.FillByIdReclamo(this.cORPORATIVADataSet.Reporte_ReclamoAProveedores, idReclamo);            
        //    //--- imprimir los datos basicos
        //    body += "<p><b>Documento Nº " + idReclamo + "</b>";
        //    body += "<br/><b>Fecha de creación: </b>" + this.cORPORATIVADataSet.Reporte_ReclamoAProveedores[0].fecha + "</p>";
        //    body += "<p><b>Proveedor: </b>" + this.cORPORATIVADataSet.Reporte_ReclamoAProveedores[0].razon_social + "<br/><b>ID del Proveedor: </b>" + this.cORPORATIVADataSet.Reporte_ReclamoAProveedores[0].id_proveedor + "</p>";
        //    body += "<p><b>Asunto: </b>" + this.cORPORATIVADataSet.Reporte_ReclamoAProveedores[0].asunto + "</p>";
        //    body += "<p><b>Descripcion del asunto: </b>" + this.cORPORATIVADataSet.Reporte_ReclamoAProveedores[0].descripcion_asunto + "</p>";
        //    body += "<p><b>Plazo de repuesta: </b>" + this.cORPORATIVADataSet.Reporte_ReclamoAProveedores[0].plazo_respuesta;
        //    body += "<br/><b>Elaborado por: </b>" + this.cORPORATIVADataSet.Reporte_ReclamoAProveedores[0].elaborado_por;
        //    body += "<br/><b>Con copia a: </b>" + this.cORPORATIVADataSet.Reporte_ReclamoAProveedores[0].con_copia_a.ToUpper() + "</p>"; 
        //    //--- imprimir datos secundarios
        //    if (temaMail.Equals(1))
        //    {
        //        body += "<p><b>Fecha en la que fue atendido: </b>" + this.cORPORATIVADataSet.Reporte_ReclamoAProveedores[0].fecha_atendido;
        //        body += "<br/><b>Respuesta del proveedor: </b>" + this.cORPORATIVADataSet.Reporte_ReclamoAProveedores[0].respuesta_proveedor;
        //        //body += "<br/><b>Debe adjuntarse el archivo adjunto de soporte: </b></p>";             
        //    }
        //    //--- enviar mail.
        //    bool ok = herramientas.SendMail.send(
        //        destinatario,
        //        remitente,
        //        nombreRemitente,
        //        asunto,
        //        body,
        //        true
        //        );
        //    if (!ok)
        //        MessageBox.Show("No se pudo enviar la notificación a:\n"+destinatario+"\n\nPor favor notifique a "+destinatario+" de esta transacción.\nGracias.");            
        //}

        private void helpPictureBox_Click(object sender, EventArgs e)
        {
            Help.ShowHelp(this, ConfiguracionDelSistema.manualDeUsuario, HelpNavigator.TableOfContents);
        }

        private void EncontrarProveedorPictureBox_Click(object sender, EventArgs e)
        {
            //--- el formulario debe estar guardado en la clase redirect, por que es muy pesado y demora mucho al abrirlo.
            try
            {
                herramientas.Redirect.getFormulario("BuscarProveedor").ShowDialog();
                //-- una vez se cierre el asistente utilizo el ID que supuestamente se selecciono de este formulario y lo guardo en el campo de busqueda.
                this.NIT_buscar_textBox.Text = ((Forms.BuscarProveedor)herramientas.Redirect.getFormulario("BuscarProveedor")).IdEncontrado;
                //-- si el valor no es vacio, tonces realizo la busqueda.
                if (!this.NIT_buscar_textBox.Text.Equals(string.Empty))
                {
                    this.buscar_Click(null, null);
                }
            }
            catch (Exception ex)
            {
                herramientas.MessageException.show(ex);
            }
        }

        private void comoSeHaceLinkLabel_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
            try
            {
                System.Diagnostics.Process.Start(ConfiguracionDelSistema.directorioVideoTutoriales + "reclamos.wmv");
            }
            catch (Exception ex)
            {
                herramientas.MessageException.show(ex);
            }
        }

        
    }
}
